package io.github.echarts.render.coordinate;

import io.github.echarts.model.coordinate.CoordinateSystem;
import io.github.echarts.model.coordinate.CoordinateSystemType;
import io.github.echarts.model.geometry.Rectangle;
import io.github.echarts.render.GraphicsRenderer;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 坐标系渲染协调器
 * 负责协调所有坐标系的渲染过程，管理坐标系渲染器
 */
public class CoordinateSystemRenderingCoordinator {
    
    /** 坐标系渲染器映射表 */
    private Map<CoordinateSystemType, CoordinateSystemRenderer> rendererMap;
    
    /** 待渲染的坐标系列表 */
    private List<CoordinateSystem> coordinateSystems;
    
    /**
     * 构造函数
     */
    public CoordinateSystemRenderingCoordinator() {
        rendererMap = new HashMap<>();
        coordinateSystems = new ArrayList<>();
        
        // 注册默认渲染器
        registerDefaultRenderers();
    }
    
    /**
     * 注册坐标系渲染器
     * 
     * @param renderer 坐标系渲染器
     */
    public void registerRenderer(CoordinateSystemRenderer renderer) {
        rendererMap.put(renderer.getSupportedType(), renderer);
    }
    
    /**
     * 注册默认的坐标系渲染器
     * 为不同类型的坐标系注册默认渲染器实现
     */
    private void registerDefaultRenderers() {
        // 注册笛卡尔坐标系渲染器
        registerRenderer(new CartesianCoordinateSystemRenderer());
        
        // 其他坐标系渲染器，待实现后取消注释
        // registerRenderer(new PolarCoordinateSystemRenderer());
        // registerRenderer(new RadarCoordinateSystemRenderer());
        
        // 注册一个默认渲染器，处理未知坐标系类型
        registerRenderer(new DefaultCoordinateSystemRenderer());
    }
    
    /**
     * 添加待渲染的坐标系
     * 
     * @param coordinateSystem 待渲染的坐标系
     */
    public void addCoordinateSystem(CoordinateSystem coordinateSystem) {
        if (coordinateSystem != null) {
            coordinateSystems.add(coordinateSystem);
        }
    }
    
    /**
     * 添加多个待渲染的坐标系
     * 
     * @param coordinateSystems 待渲染的坐标系列表
     */
    public void addCoordinateSystems(List<CoordinateSystem> coordinateSystems) {
        if (coordinateSystems != null) {
            this.coordinateSystems.addAll(coordinateSystems);
        }
    }
    
    /**
     * 渲染所有坐标系
     * 
     * @param renderer 图形渲染器
     */
    public void renderCoordinateSystems(GraphicsRenderer renderer) {
        // 渲染每个坐标系
        for (CoordinateSystem coordinateSystem : coordinateSystems) {
            renderCoordinateSystem(coordinateSystem, renderer);
        }
    }
    
    /**
     * 渲染单个坐标系
     * 
     * @param coordinateSystem 待渲染的坐标系
     * @param renderer 图形渲染器
     */
    private void renderCoordinateSystem(CoordinateSystem coordinateSystem, GraphicsRenderer renderer) {
        CoordinateSystemType type = coordinateSystem.getType();
        CoordinateSystemRenderer coordinateSystemRenderer = rendererMap.get(type);
        
        if (coordinateSystemRenderer != null) {
            coordinateSystemRenderer.render(coordinateSystem, renderer);
        } else {
            // 处理没有找到渲染器的情况
            System.err.println("未找到坐标系类型 " + type + " 的渲染器");
        }
    }
    
    /**
     * 清空所有待渲染的坐标系
     */
    public void clearCoordinateSystems() {
        coordinateSystems.clear();
    }
    
    /**
     * 默认坐标系渲染器
     * 提供基本的渲染功能，用于处理未注册专用渲染器的坐标系
     */
    private static class DefaultCoordinateSystemRenderer implements CoordinateSystemRenderer {
        @Override
        public void render(CoordinateSystem coordinateSystem, GraphicsRenderer renderer) {
            // 提供最基本的渲染实现
            // 仅用于开发阶段，实际使用时应该为每种坐标系类型提供专门的渲染器
            System.out.println("使用默认渲染器渲染坐标系: " + coordinateSystem.getType());
            
            // 渲染简单的边框，标识坐标系区域
            Rectangle area = coordinateSystem.getLayoutArea();
            if (area != null) {
                String strokeColor = "#cccccc";
                // 使用正确的参数调用drawRect方法
                renderer.drawRect(
                    (int)area.getX(), 
                    (int)area.getY(), 
                    (int)area.getWidth(), 
                    (int)area.getHeight(),
                    false,  // 不填充
                    null,   // 无填充颜色
                    strokeColor  // 边框颜色
                );
            }
        }
        
        @Override
        public CoordinateSystemType getSupportedType() {
            // 作为默认实现，返回null表示可以处理任何类型
            return null;
        }
    }
} 